﻿using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
using Sgr.Data;
using Sgr.MediatR;
using Sgr.UPMS.Infrastructure;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace Sgr.Admin.WebHost.Infrastructure.Factories
{
    /**
    *
    * 使用说明
    *
    * 1. vs 使用
    *  - 安装工具命令：dotnet tool install --global dotnet-ef
    *  - 更新工具命令：dotnet tool update --global dotnet-ef
    *  - 验证工具安装情况：dotnet ef --version
    *
    * 2. 迁移命令
    *
    *  - 添加迁移 dotnet ef migrations add UpmsSchemaSchema --context UpmsDbContext --output-dir Infrastructure/Migrations/Upms
    *  - 删除迁移 dotnet ef migrations remove --context UpmsDbContext
    *
    * 3. 数据库命令
    *
    * - 更新数据库 dotnet ef database update --context UpmsDbContext
    * - 删除数据库 dotnet ef database drop --context UpmsDbContext （使用的时候一定要注意）
    *
    * 4. SQL脚本
    * - 生成整个数据库的SQL脚本 dotnet ef migrations script --context UpmsDbContext --output ../../../docs/sql/upmsdb.sql
    * - 生成幂等SQL脚本 dotnet ef migrations script --idempotent --context UpmsDbContext --output ../../../docs/sql/idempotent_upmsdb.sql
    *
    * 其它
    * - 如果命令行工具输出乱码，可使用：$OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
    * - 如果命令行工作目录不对，可使用：cd src/Apps/Sgr.Admin.WebHost
    * - 检查命令行工作目录：$pwd
    */

    /// <summary>
    /// UPMS模块数据库上下文设计时工厂
    /// </summary>
    public class UpmsDbContextDesignFactory : IDesignTimeDbContextFactory<UpmsDbContext>
    {
        public UpmsDbContext CreateDbContext(string[] args)
        {
            //System.Diagnostics.Debugger.Launch();
            // 加载配置
            var config = new ConfigurationBuilder()
               .SetBasePath(Path.Combine(Directory.GetCurrentDirectory()))
               .AddJsonFile("appsettings.json")
               .AddJsonFile("Config/sgr_database.json", optional: false, reloadOnChange: true)
               .AddEnvironmentVariables()
               .Build();

            // 获取数据库配置信息

            var connections = config.GetSection("Sgr:DataConnectionStrings").Get<List<DataConnectionString>>();
            var dbConnection = connections?.FirstOrDefault(f => f.Name == Constant.DEFAULT_DATABASE_SOURCE_NAME)
                ?? throw new InvalidOperationException("未找到有效的数据库配置");

            var optionsBuilder = new DbContextOptionsBuilder<UpmsDbContext>();

            // 根据数据库类型配置
            switch (dbConnection.DbProvider)
            {
#if DB_MYSQL
                case DatabaseType.MySql:
                    optionsBuilder.UseMySql(
                        dbConnection.ConnectionString,
                        ServerVersion.AutoDetect(dbConnection.ConnectionString),
                        b =>
                        {
                            b.MigrationsAssembly("Sgr.Admin.WebHost");
                            // 指定SGR基础模块的迁移历史表
                            b.MigrationsHistoryTable("__EF_MigrationsHistory_UPMS");
                        });
                    break;
#endif

#if DB_SQLITE
                case DatabaseType.SQLite:
                    optionsBuilder.UseSqlite(
                        dbConnection.ConnectionString,
                        b =>
                        {
                            b.MigrationsAssembly("Sgr.Admin.WebHost");
                            // 指定SGR基础模块的迁移历史表
                            b.MigrationsHistoryTable("__EF_MigrationsHistory_UPMS");
                        });
                    break;
#endif

                default:
                    throw new InvalidOperationException($"不支持的数据库类型: {dbConnection.DbProvider}");
            }

            // 使用NoMediator作为设计时的中介者实现
            return new UpmsDbContext(optionsBuilder.Options);
        }
    }
}